6 #ifndef _CFEXPNETWORKSERVER_H_ 7 #define _CFEXPNETWORKSERVER_H_ 26 #define SERVER_STOP_FILE_NAME "stop_fexp_server.stop" 29 #define SERVER_TRECK_TRNS_DTA "meim_analysis_rs.csv" 37 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier,
typename Enable =
void>
41 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
43 <TTClientRunner, TClientThread, Tbarrier,
44 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
45 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
55 return SERVER_INSTANCE;
57 new CFEXPNetServer(server_ip, port, model, exporter, trans_analyzer));
58 return SERVER_INSTANCE;
62 virtual void Run ()
override;
63 virtual void Close()
override;
74 void create_socket ();
75 void start_listenning ();
76 void close_socket_conn();
77 void cancel_cl_threads();
79 Ptr<TClientThread> create_client_thread(
size_t id, SOCKET client_socket, std::string & ip);
80 void invoke_client_data ();
83 sockaddr_in _socket_server_adress;
84 SOCKET _socket_server;
85 std::atomic_bool _socket_server_run_and_closed;
90 std::atomic_bool _state;
94 std::atomic_bool _message_server_lunched;
95 std::queue<t_ENetThrdMsg> _message_queue_server_send;
96 std::atomic_bool _message_client_lunched;
97 std::queue<t_ENetThrdMsg> _message_queue_client_send;
104 _message_server_lunched(true), _message_client_lunched(true) { }
108 volatile bool _is_thread_to_remove;
109 std::mutex _mtx_client_thread_map_update;
110 std::atomic_bool _flag_server_close;
111 std::atomic_bool _flag_server_closed;
112 std::map<size_t, Ptr<thread_data>> _client_thread_map;
114 enum EBarrierUpdate { eNone, eAddUpdate, eRmvUpdate };
115 EBarrierUpdate _barrier_update;
116 std::mutex _mtx_barrier_update;
118 std::atomic_bool _barrier_synchr_end[t_ENetSynStgs::eSynchrCount];
119 std::atomic_bool _barrier_synchr_hit[t_ENetSynStgs::eSynchrCount];
121 void send_msg_and_wait(
t_ENetThrdMsg msg,
size_t new_thrd_id);
124 void add_new_client_thread(
size_t id, SOCKET client_socket, std::string & ip);
125 bool synchronize_process (
size_t id) noexcept(
false);
126 void set_end_client_thread(
size_t id);
127 void try_rmv_client_thread();
129 std::atomic_bool _main_proc_initialize_control;
130 std::atomic_bool _main_proc_initialize_clients;
131 size_t check_main_process_init();
133 void send_message(
size_t id_from,
size_t id_to,
t_ENetThrdMsg message);
135 bool lnch_message(
size_t id_from,
size_t id_to);
140 std::mutex _mtx_dtstep_update;
142 void update_global_t_step (
size_t new_thrd_id);
144 void analyze_data_transfer(
size_t new_thrd_id);
145 size_t _meim_analysis_counter;
146 void write_out_transfer ();
148 std::mutex _mtx_kdtree_update;
153 bool export_results (
size_t new_thrd_id);
154 void set_rnt_request();
156 void check_proc_end(
size_t new_thrd_id);
162 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
164 <TTClientRunner, TClientThread, Tbarrier,
165 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
166 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
171 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
173 <TTClientRunner, TClientThread, Tbarrier,
174 typename std::enable_if<std::is_base_of<ICFEXPThreadBase, TClientThread>::value &&
175 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
179 _socket_server(
WININVSCK), _main_proc_initialize_control(false), _main_proc_initialize_clients(false),
180 _is_thread_to_remove(false), _socket_server_run_and_closed(false),
181 _flag_server_close(false), _flag_server_closed(false),
185 #define DEFAULT_SERVER_BARRIER_COUNT 1 188 size_t(t_ENetSynStgs::eSynchrCount) - 1, idx)
191 _barrier_synchr_end[idx] =
false;
192 _barrier_synchr_hit[idx] =
false;
197 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
199 <TTClientRunner, TClientThread, Tbarrier,
200 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
201 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
211 catch (
const std::exception & ex)
222 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
224 <TTClientRunner, TClientThread, Tbarrier,
225 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
226 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
230 #define SERVER_NEW_CLIENT_CONNECT 1 231 if (_connection_start.load())
241 auto init_start_clnts_ok =
false;
242 while (!_flag_server_close.load() && !_socket_server_run_and_closed.load())
245 switch (synchronize_stat_id)
247 case t_ENetSynStgs::eStartPoint:
250 if (!synchronize_process(synchronize_stat_id++))
253 case t_ENetSynStgs::eBeforeClientUpdate:
256 invoke_client_data();
258 if (!synchronize_process(synchronize_stat_id++))
261 case t_ENetSynStgs::eClientUpdate:
263 fd_set read_set; FD_ZERO(&read_set); FD_SET(_socket_server, &read_set);
269 auto timeout_ptr = &timeout ;
274 try_rmv_client_thread();
278 sockaddr_in from;
int from_len =
sizeof(from);
279 new_thrd_id = ++client_id_generator;
280 auto new_client_socket = accept(_socket_server, (
struct sockaddr*)&from, &from_len);
281 auto new_client_ip_adr = std::string(inet_ntoa(from.sin_addr));
284 add_new_client_thread(new_thrd_id, new_client_socket, new_client_ip_adr);
289 check_main_process_init();
291 if (!synchronize_process(synchronize_stat_id++))
294 case t_ENetSynStgs::eAfterClientUpdate:
296 if (!synchronize_process(synchronize_stat_id++))
299 case t_ENetSynStgs::eEndPoint:
302 if (!synchronize_process(synchronize_stat_id++))
305 case t_ENetSynStgs::eCheckCalcEnd:
308 send_msg_and_wait(t_ENetThrdMsg::eEnd, new_thrd_id);
310 if (!synchronize_process(synchronize_stat_id++))
313 case t_ENetSynStgs::eStartNewTimeStep:
316 check_proc_end(new_thrd_id);
318 if (!synchronize_process(synchronize_stat_id++))
321 case t_ENetSynStgs::eResults:
324 send_msg_and_wait(t_ENetThrdMsg::eCalcResults, new_thrd_id);
326 export_results (new_thrd_id);
328 if (!synchronize_process(synchronize_stat_id++))
331 case t_ENetSynStgs::eStabilityControl:
334 send_msg_and_wait (t_ENetThrdMsg::eStep, new_thrd_id);
336 update_global_t_step(new_thrd_id);
338 send_msg_and_wait (t_ENetThrdMsg::eStep, new_thrd_id);
340 if (!synchronize_process(synchronize_stat_id++))
343 case t_ENetSynStgs::eDataExchange:
346 send_msg_and_wait (t_ENetThrdMsg::eBoundingBox, new_thrd_id);
348 analyze_data_transfer(new_thrd_id);
350 send_msg_and_wait (t_ENetThrdMsg::eBoundingBox, new_thrd_id);
352 send_msg_and_wait (t_ENetThrdMsg::eBoundingBox, new_thrd_id);
355 if (!synchronize_process(synchronize_stat_id++))
358 case t_ENetSynStgs::eEndLoop:
361 if (_main_proc_initialize_control && _main_proc_initialize_clients)
364 if (_transfer_analyzer)
365 _transfer_analyzer->Reset();
368 if (!synchronize_process(synchronize_stat_id))
371 synchronize_stat_id = size_t(t_ENetSynStgs::eStartPoint);
381 },
false,
"Server Process",
true);
383 invoke_close(); _flag_server_closed.store(
true);
387 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
389 <TTClientRunner, TClientThread, Tbarrier,
390 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
391 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
395 const size_t distance = size_t(t_ENetSynStgs::eEndPoint) - size_t(t_ENetSynStgs::eClientUpdate);
398 case t_ENetSynStgs::eStartPoint :
400 if (_barrier_update == EBarrierUpdate::eAddUpdate)
406 case t_ENetSynStgs::eBeforeClientUpdate:
407 if (_barrier_update == EBarrierUpdate::eAddUpdate)
411 _barrier_update = EBarrierUpdate::eNone;
414 case t_ENetSynStgs::eClientUpdate :
415 case t_ENetSynStgs::eAfterClientUpdate :
416 case t_ENetSynStgs::eEndPoint :
417 if (_barrier_update == EBarrierUpdate::eAddUpdate)
420 case t_ENetSynStgs::eCheckCalcEnd :
423 if (_barrier_update == EBarrierUpdate::eAddUpdate)
426 case t_ENetSynStgs::eStartNewTimeStep :
429 if (_barrier_update == EBarrierUpdate::eAddUpdate)
432 case t_ENetSynStgs::eResults:
434 if (_barrier_update == EBarrierUpdate::eAddUpdate)
437 case t_ENetSynStgs::eStabilityControl :
439 if (_barrier_update == EBarrierUpdate::eAddUpdate)
442 case t_ENetSynStgs::eDataExchange :
444 if (_barrier_update == EBarrierUpdate::eAddUpdate)
447 case t_ENetSynStgs::eEndLoop :
449 if (_barrier_update == EBarrierUpdate::eAddUpdate)
458 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
460 <TTClientRunner, TClientThread, Tbarrier,
461 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
462 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
466 if (!(_main_proc_initialize_control && _main_proc_initialize_clients))
472 auto id = (*IT).first;
473 if (
id == new_thrd_id)
475 send_message(GetId(),
id, msg);
479 while (msg_read_counter != _client_thread_map.size())
484 auto id = (*IT).first;
485 if (
id == new_thrd_id)
487 if (lnch_message(GetId(), (*IT).first))
496 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
498 <TTClientRunner, TClientThread, Tbarrier,
499 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
500 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
501 ::create_client_thread(
size_t id, SOCKET client_socket, std::string & ip)
506 [
this](
auto id_from,
auto id_to ) {
return read_message(id_from, id_to); },
507 [
this](
auto id_from,
auto id_to ) {
return lnch_message(id_from, id_to); },
508 [
this](
auto id_from,
auto id_to,
auto mssg) { send_message(id_from, id_to, mssg); },
509 [
this](
auto id_from ) {
return get_calc_data(id_from); },
510 [
this](
auto id_from ) { set_end_client_thread(id_from); },
511 [
this](
auto synstat ) {
return synchronize_process(synstat); },
512 [
this](
auto id_from,
auto dt ) { set_stabil_t_step(id_from, dt); },
513 [
this](
auto id_from,
auto bbox ,
auto mid ) { add_macro_to_tree(bbox, id_from, mid); }));
517 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
519 <TTClientRunner, TClientThread, Tbarrier,
520 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
521 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
522 ::invoke_client_data()
528 auto key = (*IT).first;
529 auto dta = (*IT).second;
530 auto msg = dta->_current_msg_to_send;
533 case t_ENetThrdMsg::eInit:
540 schedule = setting->GetSimpleModelSchedule();
546 auto default_model = init_models.empty();
547 auto ifile_content = [=](
auto id)
549 return (default_model ?
550 setting->GetFileContentDefault() :
551 setting->GetFileContent())[
id];
557 init_models_schedule.push(init_models.size());
560 size_t idx;
size_t mode_count = init_models_schedule.front();
563 auto model_id = init_models.front();
564 dta->_calc_data->CURRENT_DATA_FOR_SEND.insert(
568 init_models_schedule.pop();
570 _main_proc_initialize_clients =
true;
573 case t_ENetThrdMsg::eRuntimeInit:
581 dta->_calc_data->CURRENT_DATA_FOR_SEND.insert(
587 msg = t_ENetThrdMsg::eContinueProc;
590 send_message(GetId(), key, msg);
592 dta->_current_msg_to_send = t_ENetThrdMsg::eThrdMsgCount;
597 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
599 <TTClientRunner, TClientThread, Tbarrier,
600 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
601 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
602 ::add_new_client_thread(
size_t id, SOCKET client_socket, std::string & ip)
605 #define MAP_THREAD_IDX FEXPCOMMON_DEFAULT_INDX 606 #define MAP_THREAD_VALUE_IDX 1 607 if (_client_thread_map.count(
id))
610 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
612 auto cnt_tm = std::time(
nullptr);
620 _client_thread_map.insert(
MAP_PAIR(server_thread_data->_id, server_thread_data));
623 _barrier[t_ENetSynStgs::eStartPoint] =
626 server_thread_data->_thread->StartThread();
627 server_thread_data->_thread->Detach();
629 server_thread_data->_state =
true;
631 server_thread_data->_current_msg_to_send = _main_proc_initialize_control ? t_ENetThrdMsg::eRuntimeInit : t_ENetThrdMsg::eContinueProc;
633 _barrier_update = EBarrierUpdate::eAddUpdate;
640 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
642 <TTClientRunner, TClientThread, Tbarrier,
643 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
644 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
645 ::synchronize_process(
size_t id) noexcept(
false)
648 if(
id >= t_ENetSynStgs::eSynchrCount)
650 if (_barrier_synchr_end[
id].load())
652 _barrier_synchr_hit[id].store(
true );
653 _barrier [id]->SynchronizeThreads();
654 _barrier_synchr_hit[id].store(
false);
659 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
661 <TTClientRunner, TClientThread, Tbarrier,
662 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
663 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
664 ::set_end_client_thread(
size_t id)
667 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
669 if (_client_thread_map.count(
id))
671 auto cnt_tm = std::time(
nullptr);
674 _client_thread_map[id]->_state = !(_is_thread_to_remove =
true);
680 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
682 <TTClientRunner, TClientThread, Tbarrier,
683 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
684 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
685 ::try_rmv_client_thread()
688 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
690 if (_is_thread_to_remove)
692 std::vector<size_t> to_remove;
695 if (!
IT.second->_state)
696 to_remove.push_back(
IT.first);
698 size_t idx;
auto endidx = to_remove.size() - 1;
701 auto cnt_tm = std::time(
nullptr);
702 auto trd_id = to_remove[idx];
704 _client_thread_map.erase(_client_thread_map.find(trd_id));
708 _is_thread_to_remove =
false;
710 _barrier_update = !to_remove.empty() ? EBarrierUpdate::eRmvUpdate : EBarrierUpdate::eNone;
712 if (_barrier_update == EBarrierUpdate::eRmvUpdate)
714 auto tread_count = _client_thread_map.size() + 1;
730 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
732 <TTClientRunner, TClientThread, Tbarrier,
733 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
734 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
735 ::check_main_process_init()
739 if (_main_proc_initialize_control)
742 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
747 if (
IT.second->_state)
754 result = setting->GetInitClientNumber() - counter;
755 _main_proc_initialize_control.store(!_main_proc_initialize_control ? result ==
FEXPCOMMON_DEFAULT_VALUE : _main_proc_initialize_control);
758 if (_main_proc_initialize_control)
769 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
771 <TTClientRunner, TClientThread, Tbarrier,
772 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
773 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
774 ::send_message(
size_t id_from,
size_t id_to,
t_ENetThrdMsg message)
777 if (message == t_ENetThrdMsg::eThrdMsgCount)
780 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
782 if (GetId() == id_from)
785 auto thread = _client_thread_map[id_to];
786 if (thread->_message_client_lunched)
787 thread->_message_client_lunched.store(
false);
788 thread->_message_queue_server_send.push(message);
793 auto thread = _client_thread_map[id_from];
794 if (thread->_message_server_lunched)
795 thread->_message_server_lunched.store(
false);
796 thread->_message_queue_client_send.push(message);
802 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
804 <TTClientRunner, TClientThread, Tbarrier,
805 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
806 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
807 ::lnch_message(
size_t id_from,
size_t id_to)
810 return GetId() == id_from ?
811 _client_thread_map[id_to ]->_message_client_lunched.load() :
812 _client_thread_map[id_from]->_message_server_lunched.load();
816 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
818 <TTClientRunner, TClientThread, Tbarrier,
819 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
820 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
821 ::read_message(
size_t id_from,
size_t id_to)
825 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
827 if (GetId() == id_from)
829 auto thread = _client_thread_map[id_to];
830 if (!thread->_message_client_lunched.load() && !thread->_message_queue_server_send.empty())
832 message = thread->_message_queue_server_send.front();
833 thread->_message_queue_server_send.pop();
834 if (thread->_message_queue_server_send.empty())
835 thread->_message_client_lunched.store(
true);
838 message = t_ENetThrdMsg::eThrdMsgCount;
842 auto thread = _client_thread_map[id_from];
843 if (!thread->_message_server_lunched.load() && !thread->_message_queue_client_send.empty())
845 message = thread->_message_queue_client_send.front();
846 thread->_message_queue_client_send.pop();
847 if (thread->_message_queue_client_send.empty())
848 thread->_message_server_lunched.store(
true);
851 message = t_ENetThrdMsg::eThrdMsgCount;
858 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
860 <TTClientRunner, TClientThread, Tbarrier,
861 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
862 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
863 ::get_calc_data(
size_t id)
867 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
869 if (_client_thread_map.count(
id))
870 data = _client_thread_map[
id]->_calc_data;
876 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
878 <TTClientRunner, TClientThread, Tbarrier,
879 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
880 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
881 ::export_results(
size_t new_thrd_id)
884 auto result_exported =
false;
885 if (!(_main_proc_initialize_control && _main_proc_initialize_clients))
886 return result_exported;
888 std::map<size_t, Ptr<CFEXPCalculationModelNodeResult>> thread_result_map;
891 auto thrd_id = (*IT).first;
892 if (thrd_id == new_thrd_id)
894 auto results = (*IT).second->_calc_data->CURRENT_DATA_RECEIVED;
899 auto resulto_rows = results[
"rso"];
900 if (resulto_rows && !resulto_rows->empty())
907 auto result_rows = results[
"rs"];
908 if (!result_rows || result_rows->empty())
922 _model_cont->IterateModElems([&thread_result_map, &thrd_id](
auto item)
931 if (thread_result_map.empty())
932 return result_exported;
939 results = (*IT).second;
949 if (_result_exporter)
950 _result_exporter->Write(results);
951 return !result_exported;
955 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
957 <TTClientRunner, TClientThread, Tbarrier,
958 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
959 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
970 if (!
IT->second->_calc_data->CURRENT_DATA_FOR_POUT.empty())
972 IT->second->_calc_data->CURRENT_DATA_FOR_POUT
980 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
982 <TTClientRunner, TClientThread, Tbarrier,
983 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
984 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
988 std::unique_lock<std::mutex> lock(_mtx_dtstep_update, std::defer_lock);
990 _stabil_dt_step = step < _stabil_dt_step ? step : _stabil_dt_step;
995 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
997 <TTClientRunner, TClientThread, Tbarrier,
998 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
999 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1000 ::update_global_t_step(
size_t new_thrd_id)
1003 if (!(_main_proc_initialize_control && _main_proc_initialize_clients))
1008 if (
IT->first == new_thrd_id)
1010 IT->second->_calc_data->CURRENT_DATA_FOR_SEND
1017 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1019 <TTClientRunner, TClientThread, Tbarrier,
1020 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1021 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1025 if (!_transfer_analyzer)
1027 std::unique_lock<std::mutex> lock(_mtx_kdtree_update, std::defer_lock);
1030 _transfer_analyzer->AddMacro(bbox, macro_id, thrd_id);
1035 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1037 <TTClientRunner, TClientThread, Tbarrier,
1038 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1039 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1040 ::analyze_data_transfer(
size_t new_thrd_id)
1043 if (!(_main_proc_initialize_control && _main_proc_initialize_clients))
1045 ++_meim_analysis_counter;
1049 IT.second->_calc_data->MODEL_DATA_GET.clear();
1050 IT.second->_calc_data->MODEL_DATA_SET.clear();
1053 if (!_transfer_analyzer->Analyze())
1056 auto data_from = _transfer_analyzer->GetTransferComputerModelFrom ();
1057 auto data_to = _transfer_analyzer->GetTransferComputerModelTo ();
1058 auto data_assoc = _transfer_analyzer->GetMacroToComputerAssociation();
1059 if (data_from.empty() && data_to.empty())
1061 else if (data_from.empty() || data_to.empty())
1067 auto tid =
IT->first;
1068 auto dta =
IT->second->_calc_data;
1069 if (data_from.count(tid))
1071 if (data_to.count(tid))
1075 write_out_transfer();
1079 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1081 <TTClientRunner, TClientThread, Tbarrier,
1082 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1083 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1084 ::write_out_transfer()
1091 file <<
"MEIM analysis count (transfer required): " << _meim_analysis_counter << std::endl;
1095 auto tid =
IT->first;
1096 auto dta =
IT->second->_calc_data;
1097 if (dta->MODEL_DATA_GET.empty())
1099 file <<
"Data from: c" << tid << std::endl;
1101 { auto value = IT; file <<
"m" << value << FEXPCOMMON_DELIMITER; });
1107 auto tid =
IT->first;
1108 auto dta =
IT->second->_calc_data;
1109 if (dta->MODEL_DATA_SET.empty())
1111 file <<
"Data to: c" << tid << std::endl;
1113 { file <<
"m" << std::get<0>(IT) << FEXPCOMMON_DELIMITER <<
"c" << std::get<1>(IT) << std::endl; });
1119 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1121 <TTClientRunner, TClientThread, Tbarrier,
1122 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1123 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1124 ::check_proc_end(
size_t new_thrd_id)
1127 if (export_results(new_thrd_id))
1129 send_msg_and_wait(t_ENetThrdMsg::eEnd, new_thrd_id);
1131 FEXPCOMMON_FOREACH(
size_t(t_ENetSynStgs::eStartPoint),
size_t(t_ENetSynStgs::eSynchrCount) - 1, idx)
1132 _barrier_synchr_end[idx].store(
true);
1135 send_msg_and_wait(t_ENetThrdMsg::eContinueProc, new_thrd_id);
1141 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1143 <TTClientRunner, TClientThread, Tbarrier,
1144 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1145 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1149 #define ERROR_SOCKET_SERVER_CLOSE_CONNECT "Error: Server connection has already been closed: \n" 1150 #define ERROR_SOCKET_SERVER_CLOSE_RUNCLSE "Error: Try close server which was run and closed!!!" 1151 if(_socket_server_run_and_closed)
1153 if (!_connection_start.load())
1155 _socket_server_run_and_closed.store(
true);
1160 _flag_server_close.store(
true); std::vector<Ptr<CFEXPCppThread<void(size_t), size_t>>> temp_thread_vector;
1166 size_t(t_ENetSynStgs::eSynchrCount) - 1, idx)
1167 _barrier_synchr_end[idx].store(
true);
1169 while (!_flag_server_closed.load())
1173 size_t(t_ENetSynStgs::eSynchrCount) - 1, idx)
1176 if (!_barrier_synchr_hit[idx].load())
1181 ::SafeAllocInstance([
this](
auto id) { _barrier[id]->SynchronizeThreads(); }, tmpi);
1182 temp->StartThread(); temp->Detach();
1184 temp_thread_vector.push_back(temp);
1187 },
false,
"Waiting for closing of server main thread",
true);
1189 temp_thread_vector.clear();
1191 cancel_cl_threads();
1193 close_socket_conn();
1194 _socket_server_run_and_closed.store(
true);
1199 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1201 <TTClientRunner, TClientThread, Tbarrier,
1202 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1203 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1212 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1214 <TTClientRunner, TClientThread, Tbarrier,
1215 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1216 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1220 #define ERROR_SERVER_SOCKET_CREATION "Error: Cannot create socket (server): \n" 1222 WSADATA socket_info;
1224 auto result = WSAStartup(
WINSOCKET, &socket_info);
1225 if (CONNECTION_ERRORS_1.count(result))
1230 _socket_server_adress.sin_family =
WINNETWRK;
1231 _socket_server_adress.sin_addr.s_addr =
WINANYADR;
1232 _socket_server_adress.sin_port = htons((u_short)GetCommPort());
1235 if (CONNECTION_ERRORS_2.count(result))
1239 result = bind(_socket_server, (sockaddr*)&_socket_server_adress,
sizeof(_socket_server_adress));
1240 if (CONNECTION_ERRORS_4.count(result))
1251 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1253 <TTClientRunner, TClientThread, Tbarrier,
1254 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1255 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1256 ::start_listenning()
1259 #define ERROR_SOCKET_SERVER_CONNECT "Error: Server cannot start: \n" 1260 if (_socket_server_run_and_closed)
1263 std::string(
"--> Node ID") +
"\"" + CFEXPBaseConvers::NumberToString<size_t>(GetId()) +
"\":\n" +
1264 std::string(
"--> Server closed.");
1271 auto result = listen(_socket_server, 10);
1272 if (CONNECTION_ERRORS_5.count(result))
1276 std::string(
"--> Node ID ") +
"\"" + CFEXPBaseConvers::NumberToString<size_t>(GetId()) +
"\":\n";
1277 error += CONNECTION_ERRORS_4[result];
1281 _connection_start.store(
true);
1285 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1287 <TTClientRunner, TClientThread, Tbarrier,
1288 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1289 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1290 ::close_socket_conn()
1295 closesocket(_socket_server);
1301 template<
typename TTClientRunner,
typename TClientThread,
typename Tbarrier>
1303 <TTClientRunner, TClientThread, Tbarrier,
1304 typename std::enable_if<std::is_base_of<ICFEXPThreadBase , TClientThread>::value &&
1305 std::is_base_of<ICFEXPSynchrThreadBarrier, Tbarrier >::value>::type>
1306 ::cancel_cl_threads()
1309 if (_client_thread_map.empty())
1317 if (
IT.second->_state)
1318 _client_thread_map[
IT.first]->_thread->Cancel();
1324 std::unique_lock<std::mutex> lock(_mtx_client_thread_map_update, std::defer_lock);
1328 if (!
IT.second->_state)
1329 ++cancel_thread_counter;
1333 if (cancel_thread_counter == _client_thread_map.size())
1336 },
false,
"Try cancel server client threads",
true);
1338 _client_thread_map.clear();
1341 #endif // !_CFEXPNETWORKSERVER_H_ #define DEFAULT_SERVER_BARRIER_COUNT
#define WINSOCKET
Definition: FEXPNetworkWinSocket.h:20
#define IT
Definition: FEXPCommon.h:155
#define GET_MAX_FLT_VAL(type)
Definition: FEXPCommon.h:205
#define WINANYADR
Definition: FEXPNetworkWinSocket.h:26
Solver configuration setting.
Definition: FEXPSetting.h:98
#define WINSCTYPE
Definition: FEXPNetworkWinSocket.h:23
#define SERVER_STOP_FILE_NAME
Name of file controling the server state (runnung/not running).
Definition: FEXPNetworkServer.h:26
Base network interface of a client node.
Definition: FEXPNetworkInterface.h:46
static Ptr< CFEXPNetServer > GetInstance(std::string server_ip, size_t port, Ptr< ICFEXPDataModelContIntf > model, Ptr< ICFEXPResultExport > exporter, Ptr< ICFEXPTransferAnalyzer > trans_analyzer)
Definition: FEXPNetworkServer.h:51
#define DEFAULT_SERVER_NODE_ID
Definition: FEXPNetworkInterface.h:19
Windows connection errors.
Definition: FEXPNetworkWinSocket.h:36
#define ERROR_SOCKET_SERVER_CONNECT
#define FEXPCOMMON_FOREACH(start, end, index)
Definition: FEXPCommon.h:153
static Ptr< CFEXPNetServer > SERVER_INSTANCE
Definition: FEXPNetworkServer.h:66
#define FEXPCOMMON_STACAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:137
static Ptr< TType > MakeAllocInstanceSafe(TType *alloc)
Definition: FEXPCommon.h:400
#define FEXPCOMMON_FOREACH_ITER_FNC(data, lambda_body)
Definition: FEXPCommon.h:157
Definition: FEXPCommon.h:276
double t_fexpcommon_ct
Definition: FEXPCommon.h:120
Data for server clients.
Definition: FEXPNetworkInterface.h:210
ENETServerThreadMesage
Communication messages within the FEXP server.
Definition: FEXPNetworkInterface.h:155
Definition: FEXPDataContainer.h:25
#define FEXPCOMMON_DEFAULT_INDX
Definition: FEXPCommon.h:171
ENETSynchronization
Synchronization nodes within the FEXP server.
Definition: FEXPNetworkInterface.h:137
static std::enable_if< std::is_arithmetic< TValue >::value, std::string >::type NumberToString(TValue value)
Definition: FEXPCommon.h:1079
#define SERVER_TRECK_TRNS_DTA
Name of file storing of MEIM analysis results.
Definition: FEXPNetworkServer.h:29
It stores the result data.
Definition: FEXPCalculationResult.h:132
#define WININVSCK
Definition: FEXPNetworkWinSocket.h:19
#define FEXPCOMMON_EXCEPTION(error_text)
Definition: FEXPCommon.h:143
Definition: FEXPDataContainer.h:25
#define FEXPCOMMON_EMPTY_STRING
Definition: FEXPCommon.h:183
#define FEXPCOMMON_FOREACH_ITER(data)
Definition: FEXPCommon.h:156
#define ERROR_SERVER_SOCKET_CREATION
static Ptr< TType > SafeAllocInstance(VarArgs &&... inpar)
It allocates data.
Definition: FEXPCommon.h:392
#define ERROR_SOCKET_SERVER_CLOSE_RUNCLSE
#define MAP_PAIR(key, itm)
Definition: FEXPCommon.h:471
#define SERVER_NEW_CLIENT_CONNECT
CEFEXPNETProtocol::ENETSynchronization t_ENetSynStgs
Definition: FEXPNetworkInterface.h:174
Base interface for system element.
Definition: FEXPDataContainer.h:28
Base container interface.
Definition: FEXPSerializeData.h:601
#define WINNETWRK
Definition: FEXPNetworkWinSocket.h:24
#define FEXPCOMMON_DEFAULT_VALUE
Definition: FEXPCommon.h:179
static const t_FileStructMap RES_FILE_BLOCK_CLS_MAP
Definition: FEXPSerializeData.h:540
static void WriteLine()
Definition: FEXPCommon.cpp:154
Base container interface focused on processing of a serialized/deserialized data. ...
Definition: FEXPSerializeData.h:619
static bool RunProcedureTask(t_Procedure procedure, bool progressbar)
It runs the asynchronous task.
Definition: FEXPConcurency.cpp:12
Definition: FEXPNetworkServer.h:38
Smart pointer.
Definition: FEXPCommon.h:274
#define FEXPCOMMON_DYNCAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:138
#define FEXPCOMMON_DFLT_TXT
Definition: FEXPCommon.h:189
#define WINPR_TCP
Definition: FEXPNetworkWinSocket.h:21